namespace BepuUtilities
{
    // 谁想学一些超级惯用的C#？
    // 这些类型通常由值类型实现,并传递到各种性能敏感函数中。
    // 通过将泛型函数与值类型一起使用,强制进行类型专门化,并使内联成为可能。
    // 此外,在许多情况下可以避免创建临时阵列。

    /// <summary>
    /// 定义能够处理等同于foreach主体的循环体函数。在处理大值类型时采用ref参数以提高效率。
    /// </summary>
    /// <typeparam name="T">要枚举的类型。</typeparam>
    public interface IForEachRef<T>
    {
        void LoopBody(ref T i);
    }
    /// <summary>
    /// 定义能够处理等同于foreach主体的循环体函数。
    /// </summary>
    /// <typeparam name="T">要枚举的类型。</typeparam>
    public interface IForEach<T>
    {
        void LoopBody(T i);
    }

    /// <summary>
    /// 定义一个循环体函数,该函数能够处理与支持提前中断循环的foreach主体等效的函数。
    /// </summary>
    /// <typeparam name="T">要枚举的类型。</typeparam>
    public interface IBreakableForEach<T>
    {
        /// <summary>
        /// 执行循环体的一次执行。
        /// </summary>
        /// <param name="i">访问的元素。</param>
        /// <return>如果循环应继续,则为True,否则为False。</return>
        bool LoopBody(T i);
    }
    /// <summary>
    /// 定义一个循环体函数,该函数能够处理与支持提前中断循环的foreach主体等效的函数。
    /// 在处理大值类型时采用ref参数以提高效率。
    /// </summary>
    /// <typeparam name="T">要枚举的类型。</typeparam>
    public interface IBreakableForEachRef<T>
    {
        /// <summary>
        /// 执行循环体的一次执行。
        /// </summary>
        /// <param name="i">访问的元素。</param>
        /// <return>如果循环应继续,则为True,否则为False。</return>
        bool LoopBody(ref T i);
    }
}
